共计 5725 个字符,预计需要花费 15 分钟才能阅读完成。
一.OSI 七层协议数据传输封包与解包过程
- 对于现在学习计算机网络原理一般采用 五层协议 , 即 应, 表, 会 看做一个整体应用层
二. 物理层
1. 物理层的由来
- 两台计算机想要通信就必须接入到 Internet 中, 明白点就是计算机之间必须完成组网
2. 物理层的功能
将数据转换成电信号, 对应的是二进制, 高电频对应数字 1, 低电压对应数字 0, 然后发送.
物理层一组数据称之为 " 位 " 比特位
三. 数据链路层
1. 数据链路层的由来
物理层单纯的电信号 1, 0, 是没有任何意义的, 数据链路层规定电信号多少位为一组, 每组又代表什么意思.
2. 数据链路层的功能
定义了电信号的分组方式
3. 遵循协议 : 以太网协议 (enthernet)
1. 一组数据称之为一个 " 数据帧 "
2. 组成: head(头部) + data(数据)
--head: 源 MAC 地址(6 字节) + 目标 MAC 地址(6 字节) + 数据类型(6 字节)
3. 基于 MAC 地址的广播方式通信 ---> 计算机的通信方式基本靠吼
四. 网络层
1. 网络层的由来
有了 MAC 地址, 计算机之间可以相互通信, 但无法制造出供全世界一起使用的交换机, 因此必须找出一种方法来区分哪些计算机属于同一广播域,哪些不是,如果是就采用广播的方式发送,如果不是,就采用路由的方式(向不同广播域/子网分发数据包),这是 MAC 地址是无法区分的
2. 网络层的功能
引入一套新的地址用来区分不同广播域 / 子网, 即网络地址 (IP 地址 + 子网掩码)
3. 遵循协议: IP 协议
广泛采用的版本是 ipv4 版本, 它采用的是 32 位二进制 表示
1. 一组数据称之为 " 数据包 "
2. 组成: head(头部) + data(数据)
--head: 源 IP 地址 + 目的 IP 地址
3.IP 地址的通信 ----> 路由协议
4.ARP 协议工作在这一层
4.ipv4 简介
- ipv4 地址范围: 0.0.0.0 --255.255.255.255
00000000.00000000.00000000.00000000=>0.0.0.0
11111111.11111111.11111111.11111111->255.255.255.255
- 子网掩码: 由连续的 1 和连续的 0 组成
11111111.11111111.11111111.00000000-》255.255.255.0
- 子网地址: 由 IP 地址和子网掩码按位与运算得出
//IP 地址 172.16.10.1/24
10101100.00010000.00001010.00000001-->172.16.10.1
11111111.11111111.11111111.00000000-->255.255.255.0
按位与运算得网络地址结果:
10101100.00010000.00001010.00000001--> 172.16.10.0
//IP 地址 172.16.10.2/24
10101100.00010000.00001010.00000010-->172.16.10.2
11111111.11111111.11111111.00000000-->255.255.255.0
按位与运算得网络地址结果
10101100.00010000.00001010.00000001--> 172.16.10.0
结果都是 172.16.10.0,因此它们在同一个子网络(lan)。
五. 传输层
1. 传输层的由来
- 网络层的 IP 地址 帮我们划分子网
- 数据链路层的 MAC 地址 帮我们找到主机
- IP 和 MAC 找到一台特定的主机
- 而 传输层的端口 就是帮我们找到主机上的应用程序
2. 传输层的功能
提供了一台主机上的应用程序基于网络与另一台主机上的应用程序之间的通信
3. 传输层协议
1.TCP 传输控住协议(流式协议)
2.UDP 数据报协议
3. 一组数据称之为 " 数据段 "
4. 组成: head(头部) + data(数据)
--head: 源端口 + 目标端口
端口号在本机唯一即可
4. 端口的理解
端口号具有本地性质: 就是说它是为了标志本地计算机应用层中各个进程和传输层交互时的窗口, 不同主机上的端口号是没有关联的.
没有关联: 比如 PC1 有一个 888 端口号, PC2 也可以有 888 端口号, 不冲突
5. 端口号划分
前提: 只有基于网络通信的进程才有端口号的概念.
提示: 传输层端口号采用 16 位来标识一个端口, 因此会有 2^16=65536 个端口
服务器端使用的端口号: 分为 2 类
----- 熟知端口号或系统端口号(最重要): 数值为 0~1023.
----- 登记端口号: 数值为 1024~49151
客户端使用的端口号
----- 短暂端口号: 49152~65535.
六. 应用层
1. 应用层的由来
用户使用的都是应用程序,均工作于应用层,互联网是开发的,大家都可以开发自己的应用程序,数据多种多样,必须规定好数据的组织形式
2. 应用层的功能
- 规定应用程序的数据格式
3. 应用层协议
- HTTP, FTP, mail 等等
TCP 协议可以为各种各样的程序传递数据
比如 Email、WWW、FTP 等等
那么,必须有不同协议规定电子邮件、网页、FTP 数据的格式,这些应用程序协议就构成了”应用层”。
- 可以自定义协议
自定义协议需要注意的问题:
1. 两大组成部分 ==> 头部 + 数据部分
--- 头部: 放对数据的描述信息. 比如: 数据要发给谁, 数据的类型, 数据的长度
--- 数据部分: 想要发送的数据
2. 头部的长度必须固定
--- 因为接收端要通过获取固定长度的头部, 从而方便进一步获取数据部分的详细信息.
七.ARP 协议 (地址解析协议)
1. 引入
1.PC1 要与 PC2 通信,PC1 必须拿到 PC2 的 ip 地址, 可以由 IP 地址转换成 MAC 地址
2. 通信分为两类:
-- 局域网内
-- 跨局域网
3.PC1 如何确定与 PC2 是否在一个局域网内
4. 如果在一个局域网内,如何通信?---> 要拿到目标 mac 就是 PC2 的 mac 地址
5. 如果跨局域网,如何通信?---> 要拿到的目标 mac 是网关的 mac 地址
2. ARP 的工作方式
-
情况一
js
PC1: 192.168.10.11/24
PC2: 192.168.10.13/24
(1) 判断两台计算机的子网地址是否一样,如果一样,尝试获取 PC2 的 mac 地址
- ARP 发送数据包
- ARP 向所有计算机都发送一份
js
1. 碰到 FF-FF-FF-FF-FF-FF,大家知道对方想跟自己要 mac 地址
2. 如果目标 ip: 192.168.10.13/24 就是自己,那么就返回 mac 地址
- 获取到 PC2 的 MAC 才真正开始发数据
-
情况二
js
PC1: 192.168.10.11/24
PC2: 202.10.11.13/24
(1)判断两台计算机的子网地址如果 不一样 ,应该尝试获取 网关的 mac地址
- ARP 发送数据包
- 所有计算机都收到该 ARP 包
js
碰到 FF-FF-FF-FF-FF-FF,大家知道对方想跟自己要 mac 地址
如果目标 ip:192.168.10.1/24 就是自己,那么就返回 mac 地址
- 获取到网关的 MAC 后才开始发送真正的数据
3.IP + MAC
-
ip 地址 +mac 地址 =》全世界唯一一台计算机
-
ARP 会将 ip 地址转换成 mac 地址
js
要么是局域网内一台计算机的 mac 地址,要么就是网关的 mac 地址
不能是公网计算机的 mac 地址
七.TCP 协议(传输控制协议)
TCP 可靠协议(有建立连接的过程): 数据发出后需等到对方确认并收到响应包后才删除数据
优点: 保证了数据的安全性
缺点: 效率没有 UDP 高
应用: 对数据安全有要求的场景, 例如支付宝支付环节, 关系到资金
1. 三次握手
TCP 通过三次握手来建立可靠的链接, 建立连接是在沟通, 而真正的作用是发送数据
- 第一次握手
客户端向服务端发送连接请求报文段
报文的头部包含: syn = 1, ack = 0, 以及一个初始序列号 seq = x
请求发送后客户端进入 SYN_SENT 状态
- 第二次握手
服务端收到连接请求报文段后,如果同意连接,会发送一个应答:ack=x+1
应答也包含服务端的请求报文段:SYN=1,seq=y,发送完应答后服务端进入 SYN-RCVD 状态。
- 第三次握手
客户端收到服务端连接同意的应答后,还会向服务端发送一个确认报文段, 表示:服务端发来的连接同意应答已经成功收到
该报文段的头部为:seq=y+1,该报文发送完毕后,客户端和服务器端都进入 ESTABLISHED 状态,完成 TCP 三次握手。
2. 四次挥手
TCP 连接 是双向的,在四次挥手中,前两次 挥手用于断开一个方向的连接,后两次 挥手用于断开另一方向的连接。
- 第一次挥手
服务端向客户端发送连接释放请求
报文的头部包含: fin = 1, seq = X
(ack = Z+1 表示的是上一条信息的应答包)
请求发送后服务端进入 fin_wait_1 状态
- 第二次挥手
客户端收到服务端发来的释放报文后处于 CLOSE_WAIT 状态
并且会一个释放报文: ACK = x+1
服务端收到应答报文后会处于 FIN_WAIT_2 状态, 等待着客户端发送最后连接释放报文
(因为这时客户端到服务端的数据可能还没有发完)
- 第三次挥手
当客户端的数据发送完毕后, 客户端到服务端的链接就不需要存在了
就向服务端发送连接释放报文,其报文头包含:FIN=1,ack=y+1
由于在 CLOS-WAIT 状态,客户很可能又发送了一些数据,服务器就进入了 LAST-ACK(最后确认)状态,服务端的确认。
- 第四次挥手
服务端收到客户器的连接释放报文后,向客户端发出确认应答,报文头:ACK=y+2
此时客户端就进入了 TIME-WAIT(时间等待)状态。该状态会持续 2MSL(最长报文段寿命)时间,这个期间 TCP 连接还未释放,若该时间段内没有服务端的重发请求的话,客户端就进入 CLOSED 状态,服务端只要收到了客户端发出的确认,立即进入 CLOSED 状态。就结束了这次的 TCP 连接。可以看到,服务器结束 TCP 连接的时间要比客户端早一些。
八.UDP 协议(数据报协议)
UDP 不可靠协议(不需要建立链接): 数据发出后立马删除
优点: 效率高, 不占内存
缺点: 数据不安全, 不可靠
应用: 聊天软件, 信息发送失败, 再发送一条
九.socket(套接字)
1. 什么是 socket ?
- socket应用层和传输层 之间的一个抽象层,它把 TCP/IP 层复杂的操作 抽象为几个简单的接口供应用层调用以实现进程在网络中通信。
2.socket 的由来
socket 起源于 UNIX,在 Unix 一切皆文件哲学的思想下,socket 是一种 " 打开—读 / 写—关闭 " 模式的实现
服务器和客户端各自维护一个 " 文件 ",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。
十.DHCP
1. 实现网络通信, 每台主机需具备四要素
- 本机的 IP 地址
- 子网掩码
- 网关的 IP 地址
- DNS 的 IP 地址
2. 获取以上地址有两种方式
- 手动配置 ---> 静态获取
- 动态获取 --->DHCP
1." 以太网标头 ",设置发出方(本机)的 MAC 地址和接收方(DHCP 服务器)的 MAC 地址。前者就是本机网卡的 MAC 地址,后者这时不知道,就填入一个广播地址:FF-FF-FF-FF-FF-FF。2."IP 标头 ",设置发出方的 IP 地址和接收方的 IP 地址。这时,对于这两者,本机都不知道。于是,发出方的 IP 地址就设为 0.0.0.0,接收方的 IP 地址设为 255.255.255.255。3."UDP 标头 ",设置发出方的端口和接收方的端口。这一部分是 DHCP 协议规定好的,发出方是 68 端口,接收方是 67 端口。
- 这个数据包 构建 好之后, 通过广播发送, 子网内的每台主机都收到
- 开始 拆包, 以太网头的目的 mac:FF-FF-FF-FF-FF-FF 无法看出是发送给那台主机的
-
继续 拆包, 发现发出方 IP 地址为 0.0.0.0, 接收方 IP 地址为 255.255.255.255, 于是 DHCP 服务器知道包是发给它的.
-
接下来 DHCP 服务器 读包, 然后分配 IP 地址, 发送一个"DHCP 响应" 数据包, 这个包结构类似:
1." 以太网标头 " 的 MAC 地址是双方的网卡地址
2."IP 标头 " 的 IP 地址是 DHCP 服务器的 IP 地址(发出方)和 255.255.255.255(接收方)3."UDP 标头 " 的端口是 67(发出方)和 68(接收方)4. 分配给请求端的 IP 地址和本网络的具体参数则包含在 Data 部分。
十一.DNS(域名解析协议)
作用: 将 www.xxx.com 这种格式的地址解析成 IP 地址
1. 递归查询(不常用)
1. 本机向本地 DNS 服务器查询域名, 如果本地 DNS 服务器不知道
2. 那么他会以 DNS 客户的身份向相邻 DNS 服务器 or 根域名服务器继续发出询问请求(替主机查询)
3. 然后递归返回结果, 结果是返回插叙结果或者是表示无法找到
2. 迭代查询
1. 本地 DNS 服务器向根域名服务器发出查询请求
2. 根域名服务器告诉你去顶级域服务器查询
3. 顶级域又告诉你去二级域查询
4. 二级域告诉你去三级域去查询
5. 最后三级域才告诉你 www.xxx.com 格式的解析 IP 地址(返回主机)
4. 浏览器上网 DNS 查询顺序
- 浏览器 DNS 缓存(内存)
浏览器会按照一定的频率缓存 DNS 记录
- 操作系统 DNS 缓存(内存)
浏览器 DNS 里找不到会到操作系统里面找
- 本机 HOSTS 文件(硬盘)
Windows 系统中位于 C:\Windows\System32\drivers\etc
- 本地 DNS 服务器(网络)
本地指定的 DNS 地址
- 路由器指定的 DNS(远程)
路由器自动获取 DNS, 也可以登入后手动修改
- ISP 的 DNS 服务器(远程)
互联网提供商的 DNS 服务器
- 根域名服务器(远程, 跨国)
ISP 还找不到就到根域名服务器去找(美国 9 台, 欧洲三台, 日本 1 台)
5. 清除缓存方法
- 谷歌浏览器
在浏览器地址栏输入:
chrome://net-internals/#dns
点击 clear host cache
- firefox 火狐浏览器
1. 在地址栏中 about:config 并回车
2. 可能会出现一个警告信息,直接点击按钮进入,会出现 firefox 的所有配置信息
3. 通过搜索 dns 进行过滤
4. 可以看到一项名为 network.dnsCacheExpirationGracePeriod 项
5. 它对应的值就是 DNS 缓存的时间,双击此项,会出现修改的提示框,填入 0(不缓存 DNS)即可
- Windows 系统缓存
1. 打开 CMD 输入命令: ipconfig /all
2. 查看本地 DNS 缓存: ipconfig /displaydns
3. 清除本地 DNS 缓存: ipconfig /flushdns